package io;

import java.io.*;

/**
 * java将流分为两类:
 * 节点流与处理流
 *
 * 节点流:也称为低级流,是实际链接程序与另一端的"管道",负责实际读写数据的流
 *       读写一定是建立在节点流基础上进行的
 * 处理流:也称为高级流,不能独立存在,必须链接在其他流上,目的是数据流经该流时对数据
 *       做某种加工处理,简化我们对应的操作
 *
 *       实际开发中我们经常会串联一组高级流并最终链接到某个低级流上,读写数据的过程中以流水线式
 *       的对数据做加工处理.这被称为"流的链接"
 *
 * 缓冲流:java .io.BufferedOutputStream和BufferedInputStream
 * 缓冲流时一对高级流,作用是提高读写效率
 *缓冲流内部维护一组数组,默认大小为8K.无论我们使用缓冲流时是单字节读写还是块读写,
 * 最终都会被缓冲流转换为块读写8K一次的顺序读写来保证读写效率
 */
public class CopyDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("WeChat.exe");
        //将缓冲输入流创建时指定链接在文件输入流上
        BufferedInputStream bis=new BufferedInputStream(fis);

        FileOutputStream fos=new FileOutputStream("WeChat_cp.exe");
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        int d;//记录每次读取到的字节
        long start =System.currentTimeMillis();//currentTimeMillis()时间毫秒
        while ((d=bis.read())!=-1){//读取的文件末尾时就不需要在循环了
            bos.write(d);
        }
        long end =System.currentTimeMillis();
        System.out.println("复制完毕:"+(end-start)+"ms");
        //在流链接中关闭只需要关闭最外层的高级流即可.高级流的close都会自动关闭其链接的流
        bis.close();
        bos.close();

    }
}
